package pikasial;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.InvalidPropertiesFormatException;
import java.util.Properties;

/**
 * Cette classe s'occupe(ra) de générer, modifier et sauvegarder
 * la configuration de Pikasial.
 *
 * @author ESIAL - Groupe 14
 */
@SuppressWarnings("serial")
public final class Configuration extends Properties {

    /** Chemin vers le dossier de configuration. */
    public static final String DEF_CONFIG_FOLDER = System.getProperty("user.home")
            + File.separator + ".pikasial" + File.separator;

    /** Chemin du fichier de configuration. */
    public static final String DEF_CONFIG_FILE = DEF_CONFIG_FOLDER + "config.xml";

    /** Chemin vers le dossier contenant les vignettes. */
    public static final String DEF_THUMBS_FOLDER = DEF_CONFIG_FOLDER
        + "thumbnails" + File.separator;
    public static final String DEF_ALBUMS_FILE = DEF_CONFIG_FOLDER + "albums.xml";


    /* Propriétés du fichier de configuration */
    public static final String CONFIG_FOLDER_PROP = "config.folder";
    public static final String ALBUMS_FILE_PROP = "albums.config.file";
    public static final String THUMB_CACHE_SIZE_PROP = "thumbs.cache.size";
    public static final String THUMB_FOLDER_PROP = "thumbs.folder";
    public static final String THUMB_CACHE_ENABLED_PROP = "thumbs.cache.enabled";

    private static Configuration configuration = new Configuration();

    /**
     * Crée la configuration de Pikasial, sans propriété.
     */
    private Configuration() {
    	super();
    	File conf = new File(DEF_CONFIG_FILE);
    	if (conf.exists() && !Pikasial.isRestrictedModeEnabled()) {
    		try {
				loadFromXML(new FileInputStream(conf));
			} catch (InvalidPropertiesFormatException e) {
				System.err.println("Warning: Fichier de configuration corrompu !" +
						" Restauration du fichier de configuration par défaut.");
				createDefaultConfiguration();
			} catch (FileNotFoundException e) {
				System.err.println("Warning: Fichier de configuration introuvable !" +
						" Restauration du fichier de configuration par défaut.");
				createDefaultConfiguration();
			} catch (IOException e) {
				System.err.println("Erreur: Une erreur est survenue lors de la lecture du fichier" +
						" de configuration! Passage en mode restricted !");
				Pikasial.setRestrictedMode(true);
			}
    	} else createDefaultConfiguration();
    }

    /**
     * Retourne la configuration courante.
     * @return la configuration courante du programme
     */
    public static Configuration getInstance() {
        return configuration;
    }

    public void saveConfigToDisk() throws IOException {
    	if (!Pikasial.isRestrictedModeEnabled()) {
    		File conf = new File(getProperty(CONFIG_FOLDER_PROP)+File.separator+"config.xml");
    		storeToXML(new FileOutputStream(conf), "Automatically generated file, DO NOT MODIFY !");
    	}
    }

    /**
     * Crée le fichier de configuration par défaut de Pikasial, dans le
     * dossier de configuration par défaut.
     *
     * @throws java.io.IOException - Si le fichier de configuration
     * ne peut pas être ouvert pour une quelconque raison.
     * @see pikasial.Pikasial#configFolder
     * @see pikasial.Pikasial#configFilePathName
     */
    public void createDefaultConfiguration() {
        setProperty(CONFIG_FOLDER_PROP, DEF_CONFIG_FOLDER);
        setProperty(ALBUMS_FILE_PROP, DEF_ALBUMS_FILE);
        setProperty(THUMB_CACHE_ENABLED_PROP,"true");
        setProperty(THUMB_FOLDER_PROP,DEF_THUMBS_FOLDER);
        setProperty(THUMB_CACHE_SIZE_PROP, ""
            + pikasial.utils.GestionnaireCacheVignettes.DEF_CACHE_SIZE);
    }
}
